//package com.thread;
//
//import java.util.concurrent.*;
//
///**
// * 当线程超负载了，使用拒绝策略
// * Created by zhuangqi on 17-6-27.
// */
//public class RejectPoolDemo {
//
//    public static class MyTask implements Runnable{
//
//        @Override
//        public void run() {
//            System.out.println(System.currentTimeMillis() + ":Thread ID："
//                    + Thread.currentThread().getId());
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    public static void main(String[] args) throws InterruptedException {
//        MyTask myTask = new MyTask();
//        /**
//         * corePoolSize     核心线程数量
//         * maximumPoolSize  线程池中最大线程数量
//         * keepAliveTime    当前线程数量超过corePoolSize时，多余的空闲线程的存活时间。
//         * unit             keepAliveTime的单位
//         * workQueue        任务队列，被提交但未执行的任务
//         * threadFactory    线程工厂
//         * handler          拒绝策略
//         *
//         * 当一个任务通过execute(Runnable)方法欲添加到线程池时：
//         * 1. 如果线程池中运行的线程 小于corePoolSize ，即使线程池中的线程都处于空闲状态，也要创建新的线程 来处理被添加的任务。
//         * 2. 如果线程池中运行的线程大于等于corePoolSize，但是缓冲队列 workQueue未满 ，那么任务被放入缓冲队列 。
//         * 3. 如果此时线程池中的数量大于corePoolSize，缓冲队列workQueue满(即无法将请求加入队列 )，并且线程池中的数量小于maximumPoolSize，建新的线程 来处理被添加的任务。
//         * 4. 如果此时线程池中的数量大于corePoolSize，缓冲队列workQueue满，并且线程池中的数量等于maximumPoolSize ，那么通过 handler 所指定的策略来处理此任务。
//         * 5. 当线程池中的线程数量大于 corePoolSize时，如果某线程空闲时间超过keepAliveTime，线程将被终止 。这样，线程池可以动态的调整池中的线程数。
//         */
//        ExecutorService es = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS,
//                new LinkedBlockingDeque<>(10), Executors.defaultThreadFactory(),
//                new RejectedExecutionHandler() {
//                    @Override
//                    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
//                        System.out.println(r.toString() + "is discard");
//                    }
//                });
//        for (int i = 0; i < Integer.MAX_VALUE; i++) {
//            es.execute(myTask);
//            Thread.sleep(10);
//        }
//
//    }
//}
